﻿/**
   Данный компонент символизирует звезду. Ее может поднимать аквалангист, относить на борт корабля. Во время падения ее нельзя собрать. Собирается на земле. Опрашивает окружающую среду, достигла лои она дна
 */

(F.StarStateEnum = function () {
    var sse = F.StarStateEnum;
    sse.Drop = "Drop";
    sse.Captured = "Captured";
    sse.NotMobile = "NotMobile";
})();


(function () {
    "use strict";

    F.Star = function (container, environment, x, y) {
        var self = this;
        F.Star.superclass.constructor.apply(self, [container, environment]);

        //Регистрируемся в окружающей среде
        self.environment.registerStar(this);

        self.initialWidth = 46;
        self.initialHeight = 43;

        //Звезды характеризуются
        /**
           Текущим состоянием в котором они находятся. Падают, захвачены, лежат.
           Оценкой.

           Какая получится звезда, генерируем здесь.

           Координаты
         */
         
         self.state = F.StarStateEnum.Drop;
         self.maxCost = 10;
         self.cost = Math.ceil((Math.random() * self.maxCost));
         self.centerCoord = {
            x: 22,
            y: 22
         };
         self.gameBox = environment.getGameBox();
         self.velocity = 80;
         self.offset = Math.random() * 20 - 10; //Случайное небольшое смещеине на дне


        //Рыб инициализируем случайным размером, и случайной прозрачностью.
        
        //рыбы, характеризуются
        self.width = self.initialWidth;
        self.height = self.initialHeight;

        self.x = x;
        self.y = y;

        if (!self.validateCoord()){
            self.destroy();
            return;
        }

        var img = self.starImg = new Image();
        img.src = "images/" + "tf-star"+ self.cost +".png";
        img.className = "star";
        img.style.width = self.width + "px";
        img.style.height = self.height + "px";
        self.process(0);

        container.appendChild(img);
    };

    extend(F.Star, F.Shape);

    var sp = F.Star.prototype;

    sp.process = function (dt) {
        var self = this;

        //Обработка в зависимости от стейта
        switch(self.state) {
            case F.StarStateEnum.Drop:
                self.y = self.y - self.velocity * dt;

                if (!self.validateCoord()){
                    //не можем дальше падать
                    self.state = F.StarStateEnum.NotMobile;//СТановимся неподвижны
                }
        	    break;
            case F.StarStateEnum.Captured:
                break;
            case F.StarStateEnum.NotMobile:
                break;
        }

        //Смещаем, что бы звезда рисовалась по центру координат
        var xy = self.environment.translateGameToReal(self.x - self.centerCoord.x, self.y + self.centerCoord.y);
        self.starImg.style.left = xy.x + "px";
        self.starImg.style.top = xy.y + "px";
    };

    sp.validateCoord = function () {
        var self = this;
        return  self.y - self.height - self.offset > self.gameBox.y;
    };

    sp.getCoord = function () {
        var self = this;
        return {
            x: self.x - self.centerCoord.x,
            y: self.y + self.centerCoord.y
        };
    };

    sp.setCoord = function (x, y) {
        var self = this;
        //Координаты можно установить, но только если мы в состоянии захвачены
        if (self.state != F.StarStateEnum.Captured)
            throw "Setting coordinates for invalid state.";
        self.x = x;
        self.y = y;
    };

    sp.getState = function () {
        var self = this;
        return self.state;
    };

    sp.captureStar = function (aqualunger) {
        var self = this;
        if (self.state !== F.StarStateEnum.NotMobile)
            throw "Logical error. You can not grab a star that falls or has already been captured.";
        self.state = F.StarStateEnum.Captured
    };

    sp.isNotMobile= function () {
        var self = this;
        return self.state === F.StarStateEnum.NotMobile;
    };

    sp.freeStar = function (aqualunger) {
        var self = this;
        if (self.state !== F.StarStateEnum.Captured)
            throw "Logical error. You can not release a star that falls, or does not move.";
        self.state = F.StarStateEnum.Drop
    };

    sp.destroy = function () {
        var self = this;
        F.Star.superclass.destroy.apply(self);
        self.environment.unregisterStar(self);
        if (self.starImg){
            self.container.removeChild(self.starImg);
        }
        self.starImg = null;
    };

    sp.getRate = function(){
        var self = this;
        return self.cost;
    }

    sp = null;

} ());